/*
 * $Id: sttp.h,v 1.11 2005-12-28 14:46:55 bacon Exp $
 */

#ifndef _XP_NET_STTP_H_
#define _XP_NET_STTP_H_

#include <xp/types.h>
#include <xp/macros.h>
#include <xp/net/socket.h>
#include <xp/bas/stdlib.h>
#include <xp/bas/time.h>
#include <xp/bas/str.h>

enum 
{
	XP_STTP_MAX_INBUF_LEN = 1024,
	XP_STTP_MAX_OUTBUF_LEN = 1024
};

enum
{
	XP_STTP_ENONE = 0,
	XP_STTP_ETMOUT,
	XP_STTP_EILSEQ,
	XP_STTP_ERECV,
	XP_STTP_ESEND,
	XP_STTP_ENOMEM,
	XP_STTP_EWRONGCHAR,
	XP_STTP_ECMDNAME,
	XP_STTP_ETOOLONGCMD,
	XP_STTP_ETOOMANYARGS,
	XP_STTP_EWRONGARG,
	XP_STTP_ESEMICOLON,
	XP_STTP_ECANCEL
};

struct xp_sttp_t
{
	xp_sckhnd_t handle;
	int errnum;

	xp_time_t recv_timeout;
	xp_time_t send_timeout;

	xp_size_t max_raw_cmd_len;
	xp_size_t max_arg_count;
	xp_size_t raw_cmd_len;

	xp_bool_t opt_enc_always;
	xp_bool_t opt_enc_recv;
	xp_bool_t opt_enc_send;
	xp_bool_t opt_send_newline;

	xp_rc4_t rc4_recv;
	xp_rc4_t rc4_send;

	xp_mchar_t inbuf[XP_STTP_MAX_INBUF_LEN];
	xp_mchar_t outbuf[XP_STTP_MAX_OUTBUF_LEN];

	xp_size_t  inbuf_len;
	xp_size_t  outbuf_len;
	xp_size_t  curp;
	xp_cint_t  curc;

	int      token_type;
	xp_str_t token_value;

	xp_bool_t cancel_recv;
	xp_bool_t __dynamic;
};

typedef struct xp_sttp_t xp_sttp_t;

#ifdef __cplusplus
extern "C" {
#endif

xp_sttp_t* xp_sttp_open (xp_sttp_t* sttp, xp_sckhnd_t handle);
void xp_sttp_close (xp_sttp_t* sttp);

int xp_sttp_recv (xp_sttp_t* sttp, xp_str_t* cmd, xp_size_t* count);

int xp_sttp_send (xp_sttp_t* sttp,
	const xp_char_t* name, xp_size_t nargs, ...);
int xp_sttp_sendn (xp_sttp_t* sttp, 
	const xp_char_t* name, xp_size_t nargs, const xp_char_t* args[]);

void xp_sttp_cancelrecv (xp_sttp_t* sttp);

#ifdef __cplusplus
}
#endif

#endif
